package com.pakazaka.simplecrawler;

import java.awt.Color;
import java.awt.Graphics;

/**
 *
 * @author Remi
 */
public class Bresenham {
    // Этот код "рисует" все 9 видов отрезков. Наклонные (из начала в конец и из конца в начало каждый), вертикальный и горизонтальный - тоже из начала в конец и из конца в начало, и точку.

    private static int sign(int x) {
        return (x > 0) ? 1 : (x < 0) ? -1 : 0;
        //возвращает 0, если аргумент (x) равен нулю; -1, если x < 0 и 1, если x > 0.
    }

    private static void drawLine(int x, int y, int[][] visiblity, Graphics g) {
        visiblity[x][y] = 1;
        g.setColor(Color.red);
    }

    public static void drawBresenhamLine(int xstart, int ystart, int xend, int yend, int[][] visiblity, Graphics g) {
        int x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;

        dx = xend - xstart;//проекция на ось икс
        dy = yend - ystart;//проекция на ось игрек

        incx = sign(dx);
        incy = sign(dy);

        if (dx < 0) {
            dx = -dx;
        }
        if (dy < 0) {
            dy = -dy;
        }

        if (dx > dy) {
            pdx = incx;
            pdy = 0;
            es = dy;
            el = dx;
        } else {
            pdx = 0;
            pdy = incy;
            es = dx;
            el = dy;
        }

        x = xstart;
        y = ystart;
        err = el / 2;
        drawLine(x, y, visiblity, g);
        for (int t = 0; t < el; t++) //идём по всем точкам, начиная со второй и до последней
        {

            //next
            err -= es;
            if (err < 0) {
                err += el;
                x += incx;//сдвинуть прямую (сместить вверх или вниз, если цикл проходит по иксам)
                y += incy;//или сместить влево-вправо, если цикл проходит по y
            } else {
                x += pdx;//продолжить тянуть прямую дальше, т.е. сдвинуть влево или вправо, если
                y += pdy;//цикл идёт по иксу; сдвинуть вверх или вниз, если по y
            }
            //если встретилось препятствие, прекращаем отрисовку области видимости

            try {
                drawLine(x, y, visiblity, g);
            } catch (Exception ex) {
            }

//            if (!SimpleCrawler.core.getLayer().getMap()[x][y].isLightPass()) {
//                break;
//            }
        }
    }
}
